#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#include <ctype.h>
#include <stdbool.h>
#include <sys/stat.h>

// 学生信息结构体
typedef struct {
    char class[20];      // 班级
    char student_id[13]; // 学号
    char name[20];       // 姓名
} Student;

// 5名同学的信息（硬编码）
Student student_db[] = {
    {"网工2403", "24403000604", "小王"},
    {"网工2403", "24403000607", "小高"},
    {"网工2403", "24403000708", "小李"},
    {"网工2403", "24403000709", "小张"},
    {"网工2403", "24403000710", "小刘"}
};
const int db_size = sizeof(student_db) / sizeof(Student);

// 检查字符串是否全是数字
bool is_all_digits(const char *str) {
    for (int i = 0; str[i]; i++) {
        if (!isdigit((unsigned char)str[i])) {
            return false;
        }
    }
    return true;
}

// 从文件名中提取学号
char* extract_student_id(const char *filename) {
    static char id[13] = {0};
    const char *p = filename;
    int count = 0;
    const char *start = NULL;
    
    while (*p) {
        if (isdigit((unsigned char)*p)) {
            if (count == 0) start = p;
            count++;
            if (count == 12) {
                strncpy(id, start, 12);
                id[12] = '\0';
                return id;
            }
        } else {
            count = 0;
        }
        p++;
    }
    return NULL;
}

// 通过学号查找学生信息
const Student* find_student_by_id(const char *student_id) {
    for (int i = 0; i < db_size; i++) {
        if (strcmp(student_db[i].student_id, student_id) == 0) {
            return &student_db[i];
        }
    }
    return NULL;
}

// 检查文件名是否已存在
bool file_exists(const char *filename) {
    FILE *file = fopen(filename, "r");
    if (file) {
        fclose(file);
        return true;
    }
    return false;
}

// 创建备份目录
void create_backup_dir() {
    struct stat st = {0};
    if (stat("backup", &st) == -1) {
        mkdir("backup", 0755);
    }
}

// 主函数：处理文件重命名
void rename_zip_files() {
    DIR *dir;
    struct dirent *entry;
    
    printf("\n======================================\n");
    printf("      ZIP文件重命名工具 - C语言版\n");
    printf("======================================\n");
    printf("预置学生数据库 (%d人):\n", db_size);
    for (int i = 0; i < db_size; i++) {
        printf("- %s-%s-%s\n", student_db[i].class, 
               student_db[i].student_id, student_db[i].name);
    }
    
    // 创建备份目录
    create_backup_dir();
    
    if ((dir = opendir(".")) == NULL) {
        perror("无法打开目录");
        return;
    }
    
    printf("\n开始扫描ZIP文件...\n");
    int processed = 0;
    
    while ((entry = readdir(dir)) != NULL) {
        const char *filename = entry->d_name;
        const char *ext = strrchr(filename, '.');
        
        // 检查是否为ZIP文件
        if (ext == NULL || strcasecmp(ext, ".zip") != 0) {
            continue;
        }
        
        printf("\n处理文件: %s\n", filename);
        
        // 尝试提取学号
        char *student_id = extract_student_id(filename);
        const Student *student = NULL;
        
        // 使用学号匹配
        if (student_id != NULL) {
            printf("  提取到学号: %s\n", student_id);
            student = find_student_by_id(student_id);
        }
        
        // 如果找到学生信息，生成新文件名
        if (student != NULL) {
            char new_name[100];
            snprintf(new_name, sizeof(new_name), "%s-%s-%s.zip", 
                     student->class, student->student_id, student->name);
            
            // 检查新文件名是否已存在
            if (file_exists(new_name)) {
                printf("  警告: 目标文件 %s 已存在，跳过重命名\n", new_name);
            } else {
                // 执行重命名
                if (rename(filename, new_name) == 0) {
                    printf("  重命名成功: %s -> %s\n", filename, new_name);
                    processed++;
                } else {
                    perror("  重命名失败");
                }
            }
        } else {
            printf("  警告: 无法匹配学生信息，跳过\n");
        }
    }
    
    closedir(dir);
    
    printf("\n处理完成! 共处理 %d 个文件\n", processed);
    printf("======================================\n");
}

int main() {
    rename_zip_files();
    return 0;
}